추상 팩토리는 여러 종류의 연관된 객체들을 생성해야 할 경우 사용한다.
struct HotDrink{
virtual void prepare(int volume)=0;
};
struct Tea: HotDrink{
void prepare(int volume) override {
cout<<"The tea bag, boil water, pour "<<volume<<"ml, add some lemon"<<endl;
}
};
struct Coffee: HotDrink{
void prepare(int volume) override {
cout<<"The coffee, boil water, pour "<<volume<<"ml, add some sugar"<<endl;
}
};
unique_ptr<HotDrink> make_drink(string type){
unique_ptr<HotDrink> drink;
if(type=="tea"){
drink=make_unique<Tea>();
drink->prepare(200);
} else {
drink=make_unique<Coffee>();
drink->prepare(50);
}
return drink;
}
음료의 종류가 Tea, Coffee 두 종류일 때는 위처럼 조건문을 이용해서 함수를 생성할 수 있다.
팩토리로 구현하는 경우
struct HotDrinkFactory{
virtual unique_ptr<HotDrink> make() const=0;
};
struct CoffeeFactory: HotDrinkFactory{
unique_ptr<HotDrink> make() const override {
return make_unique<Coffee>();
}
};
struct TeaFactory: HotDrinkFactory{
unique_ptr<HotDrink> make() const override {
return make_unique<Tea>();
}
};
상위 수준에서 다른 음료(차가운 음료)를 만들어야 하는 경우를 위한 DrinkFactory
DrinkFactory{
map<string, unique_ptr<HotDrinkFactory>> hot_factories;
public:
DrinkFactory(){
hot_factories["coffee"]=make_unique<CoffeFactory>();
hotfactories["tea"]=make_unique<TeaFactory>();
}
unique_ptr<HotDrink> make_drink(const string& name){
auto drink=hot_factories[name]->make();
drink->prepare(200);
return drink;
}
};